﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;

namespace HeathCareSystem
{
    public class BenhNhanDAO
    {
        DataProvider dp = new DataProvider();

        //them benh nhan moi
        public bool ThemBenhNhanMoi(BenhNhanDTO benhNhan)
        {
            string strSQL = string.Format("INSERT INTO BenhNhan (MaBenhNhan, HoTen, GioiTinh, NgaySinh, DiaChi, SoDienThoai, QueQuan, TinhTrangHonNhan, MaTaiKhoan, DaXoaBenhNhan)" +
                                            " VALUES (N'{0}', '{1}', N'{2}', CONVERT(DATETIME, '{3}', 102), N'{4}', N'{5}', N'{6}', N'{7}', {8}, '{9}')",
                                            
                                            benhNhan.maBenhNhan, benhNhan.hoTen, benhNhan.gioiTinh, benhNhan.ngaySinh, benhNhan.diaChi, benhNhan.soDienThoai, benhNhan.queQuan, benhNhan.tinhTrangHonNhan, benhNhan.maTaiKhoan, benhNhan.daXoaBenhNhan);
            return dp.ExecuteNonQuery(strSQL);
        }

        // cap nhat lai thong tin benh nhan
        public bool CapNhatBenhNhan(BenhNhanDTO benhNhan)
        {
            string strSQL = string.Format("UPDATE BenhNhan SET " +
                                          "  HoTen = N'{0}', GioiTinh = N'{1}', NgaySinh = CONVERT(DATETIME, '{2}', 102), " +
                                          "DiaChi = N'{3}', SoDienThoai = N'{4}', QueQuan = N'{5}', TinhTrangHonNhan = N'{6}'" +
                                          " WHERE maBenhNhan = N'{7}'",
                                            benhNhan.hoTen, benhNhan.gioiTinh, benhNhan.ngaySinh, benhNhan.diaChi, benhNhan.soDienThoai, benhNhan.queQuan, benhNhan.tinhTrangHonNhan, benhNhan.maBenhNhan);
            return dp.ExecuteNonQuery(strSQL);
        }

        public bool XoaBenhNhan(string maBenhNhan)
        {
            string strSQL = string.Format("UPDATE BenhNhan SET DaXoaBenhNhan = 'True' WHERE maBenhNhan = N'{0}'", maBenhNhan);
            return dp.ExecuteNonQuery(strSQL);
        }
        //tao ma benh nhan tu dong
        public String TaoMaBenhNhan()
        {
            // Chuỗi cố định trong mã phiếu khám bệnh
            string strChu;
            //tao ngay
            DateTime dtNow = DateTime.Now;
            string strDay = dtNow.Day.ToString("00");
            string strMonth = dtNow.Month.ToString();
            
            string temp = dtNow.Year.ToString("00");
            string strYear = temp.Substring(2, 2);
            strChu = strYear + strMonth + strDay;
            String strSo = "0";

            String strMaDau = "BN" + strChu + "00";

            String strSql = "SELECT TOP 1 MaBenhNhan FROM BENHNHAN ORDER BY MaBenhNhan DESC";

            try
            {
                String strMaCuoi = dp.ExecuteScalar(strSql).ToString();
                string ngay, thang, nam;
                nam = strMaCuoi.Substring(2, 8).ToString().Substring(0, 2);
                thang = strMaCuoi.Substring(4, 6).ToString().Substring(0, 2);
                ngay = strMaCuoi.Substring(6, 4).ToString().Substring(0, 2);
                String strTemp = "00";
                if (nam == strYear)
                {
                    if (thang == strMonth)
                    {
                        if (ngay == strDay)
                        {
                            strTemp = ((int.Parse(strMaCuoi.Remove(0, 8)) + 1)).ToString("00");
                        }
                        else
                            strTemp = "00";
                    }
                }
                String strMaBenhNhan = "BN" + strChu + strTemp;
                //while (strMaBenhNhan.Length + strTemp.Length < 10)
                //    strMaBenhNhan += strSo;
                return strMaBenhNhan;

            }
            catch (Exception)
            {
                return strMaDau;
            }
        }

        // hien thi danh sach benh nhan
        public DataTable DanhSachBenhNhan()
        {
            DataTable dtKetQua = new DataTable();
            string strSQL = string.Format("Select * from BENHNHAN where DaXoaBenhNhan = 'False'");
            dtKetQua = dp.ExecuteQuery(strSQL);
            return dtKetQua;
        }
        //hien thi benh nhan theo ma benh nhan
        public BenhNhanDTO HienThiBenhNhan(string maBenhNhan)
        {
            BenhNhanDTO benhNhanKQ = new BenhNhanDTO();
            DataTable dt = new DataTable();
            string strSQL = string.Format("Select * from BENHNHAN where (MaBenhNhan = N'{0}') AND DaXoaBenhNhan = 'False' ", maBenhNhan);
            dt = dp.ExecuteQuery(strSQL);
            try
            {
                benhNhanKQ.maBenhNhan = dt.Rows[0][0].ToString();
                benhNhanKQ.hoTen = dt.Rows[0][1].ToString();
                benhNhanKQ.gioiTinh = dt.Rows[0][2].ToString();
                benhNhanKQ.ngaySinh = DateTime.Parse(dt.Rows[0][3].ToString());
                benhNhanKQ.diaChi = dt.Rows[0][4].ToString();
                benhNhanKQ.soDienThoai = dt.Rows[0][5].ToString();
                benhNhanKQ.queQuan = dt.Rows[0][6].ToString();
                benhNhanKQ.tinhTrangHonNhan = dt.Rows[0][7].ToString();
                benhNhanKQ.maTaiKhoan = Int32.Parse(dt.Rows[0][8].ToString());
            }
            catch (Exception ex)
            {
                benhNhanKQ = null;
                Console.WriteLine("Error accessing the database: {0}", ex.Message);
            }
            return benhNhanKQ;
        }

        //tim benh nhan theo Ten Benh Nhan       
        public List<BenhNhanDTO> TimBenhNhan(string tenBenhNhan)
        {            
            List<BenhNhanDTO> lst = new List<BenhNhanDTO>();
            try
            {
                DataTable dt = new DataTable();
                string strSQL = string.Format("Select * from BENHNHAN where (HoTen Like N'%{0}%') And  DaXoaBenhNhan = 'False'", tenBenhNhan);
                dt = dp.ExecuteQuery(strSQL);
                foreach (DataRow dr in dt.Rows)
                {
                    BenhNhanDTO kq = new BenhNhanDTO();
                    kq.maBenhNhan = dr["MaBenhNhan"].ToString();
                    kq.hoTen = dr["HoTen"].ToString();
                    kq.gioiTinh = dr["GioiTinh"].ToString();
                    string temp = DateTime.Parse(dr["NgaySinh"].ToString()).ToShortDateString();

                    kq.ngaySinh = Convert.ToDateTime(temp);
                    kq.diaChi = dr["Diachi"].ToString();
                    kq.soDienThoai = dr["SodienThoai"].ToString();
                    kq.queQuan = dr["QueQuan"].ToString();
                    lst.Add(kq);
                }
            }
            catch (Exception)
            {
                lst = null;
            }
            return lst;
        }

        /// <summary>
        /// Bao cao thong tin chi tiet benh nhan
        /// </summary>
        /// <param name="queQuan">Que quan</param>
        /// <param name="gioiTinh">Gioi tinh</param>
        /// <param name="namNhoNhat">Nam nho nhat</param>
        /// <param name="namLonNhat">Nam lon nhat</param>
        /// <returns></returns>
        public DataTable BaoCaoChiTietBenhNhan(string queQuan, string gioiTinh, string namNhoNhat, string namLonNhat)
        {
            DataTable dt = new DataTable();

            string strSQL = string.Format("SELECT HoTen AS 'Họ Tên', GioiTinh AS 'Giới Tính', NgaySinh AS 'Ngày sinh', QueQuan AS 'Quê Quán', LEFT(CONVERT(date, NgaySinh, 112), 4) - year(getdate()) AS 'Tuổi' FROM BenhNhan WHERE (QueQuan = N'{0}') AND (GioiTinh = N'{1}') AND (NgaySinh BETWEEN '{2}' AND '{3}') AND ( DaXoaBenhNhan = 'False')", queQuan, gioiTinh, namNhoNhat, namLonNhat);
            dt = dp.ExecuteQuery(strSQL);
            return dt;
        }

        //Báo cáo số lượng bệnh nhân theo từng loại bệnh trong tháng
        /// <summary>
        /// Bao cao so luong benh nhan trong form BaoCaoSoLuongBenh
        /// </summary>
        /// <param name="thangNam">Ngay thang bao cao</param>
        /// <returns></returns>
        public DataTable BaoCaoTheoLoaiBenh(string thangNam)
        {
            DataTable dt = new DataTable();
            string strSQL = string.Format("SELECT lb.TenBenh AS 'Tên Bệnh', COUNT(ctba.NgayKham) AS 'Số lượng' FROM LoaiBenh AS lb JOIN ChanDoanBenh AS cdb ON lb.MaBenh = cdb.MaBenh JOIN ChiTietBenhAn AS ctba ON cdb.MaChiTietBenhAn = ctba.MaChiTietBenhAn WHERE LEFT(CONVERT(date, ctba.NgayKham, 112),7) = '{0}' GROUP BY lb.TenBenh", thangNam);
            dt = dp.ExecuteQuery(strSQL);
            return dt;
        }

        public List<BenhNhanDTO> TimBenhNhanTheoTenBenhNhan(string tenBenhNhan)
        {
            List<BenhNhanDTO> lst = new List<BenhNhanDTO>();
            try
            {
                DataTable dt = new DataTable();
                string strSQL = string.Format("Select * from BENHNHAN where (HoTen Like N'%{0}%') AND (DaXoaBenhNhan = 'False')", tenBenhNhan);
                dt = dp.ExecuteQuery(strSQL);
                foreach (DataRow dr in dt.Rows)
                {
                    BenhNhanDTO kq = new BenhNhanDTO();
                    kq.maBenhNhan = dr["MaBenhNhan"].ToString();
                    kq.hoTen = dr["HoTen"].ToString();
                    lst.Add(kq);
                }
            }
            catch (Exception)
            {
                lst = null;
            }
            return lst;
        }

        /// <summary>
        /// Su dung trong ham tim kiem benh nhan
        /// </summary>
        /// <param name="maBenhNhan">Mã bệnh nhân</param>
        /// <param name="tenBenhNhan">Tên bệnh nhân</param>
        /// <param name="ngaySinh">Ngày sinh</param>
        /// <param name="loaiBenh">Loại bệnh</param>
        /// <returns>DataTable</returns>
        public DataTable TimKiemBenhNhan(string tenBenhNhan, string ngaySinh, string loaiBenh)
        {
            DataTable dt = new DataTable();
            string strSQL = "";
            if (tenBenhNhan != "" && ngaySinh != "" && loaiBenh != "")
            {
                strSQL = string.Format("SELECT bn.HoTen AS 'Họ Tên', bn.GioiTinh AS 'Giới Tính', bn.NgaySinh AS 'Ngày Sinh', bn.DiaChi AS 'Địa Chỉ', bn.SoDienThoai AS 'Số Điện Thoại', bn.QueQuan AS 'Quê Quán'"
                   + " FROM BenhNhan AS bn INNER JOIN ChiTietBenhAn AS ctba ON bn.MaBenhNhan = ctba.MaBenhNhan INNER JOIN"
                   + " ChanDoanBenh AS cdb ON ctba.MaChiTietBenhAn = cdb.MaChiTietBenhAn INNER JOIN"
                   + " LoaiBenh AS lb ON cdb.MaBenh = lb.MaBenh"
                   + " WHERE (bn.HoTen LIKE '%{0}%') AND (bn.NgaySinh LIKE '%{1}%') AND (lb.MaBenh LIKE '%{2}%') AND ( bn.DaXoaBenhNhan = 'False')", tenBenhNhan, ngaySinh, loaiBenh);
            }

            if (tenBenhNhan == "" && ngaySinh != "" && loaiBenh != "")
            {
                strSQL = string.Format("SELECT bn.HoTen AS 'Họ Tên', bn.GioiTinh AS 'Giới Tính', bn.NgaySinh AS 'Ngày Sinh', bn.DiaChi AS 'Địa Chỉ', bn.SoDienThoai AS 'Số Điện Thoại', bn.QueQuan AS 'Quê Quán'"
                   + " FROM BenhNhan AS bn INNER JOIN ChiTietBenhAn AS ctba ON bn.MaBenhNhan = ctba.MaBenhNhan INNER JOIN"
                   + " ChanDoanBenh AS cdb ON ctba.MaChiTietBenhAn = cdb.MaChiTietBenhAn INNER JOIN"
                   + " LoaiBenh AS lb ON cdb.MaBenh = lb.MaBenh"
                   + " WHERE (bn.NgaySinh LIKE '%{0}%') AND (lb.MaBenh LIKE '%{1}%') AND ( bn.DaXoaBenhNhan = 'False')", ngaySinh, loaiBenh);
            }

            if (tenBenhNhan != "" && ngaySinh == "" && loaiBenh != "")
            {
                strSQL = string.Format("SELECT bn.HoTen AS 'Họ Tên', bn.GioiTinh AS 'Giới Tính', bn.NgaySinh AS 'Ngày Sinh', bn.DiaChi AS 'Địa Chỉ', bn.SoDienThoai AS 'Số Điện Thoại', bn.QueQuan AS 'Quê Quán'"
                   + " FROM BenhNhan AS bn INNER JOIN ChiTietBenhAn AS ctba ON bn.MaBenhNhan = ctba.MaBenhNhan INNER JOIN"
                   + " ChanDoanBenh AS cdb ON ctba.MaChiTietBenhAn = cdb.MaChiTietBenhAn INNER JOIN"
                   + " LoaiBenh AS lb ON cdb.MaBenh = lb.MaBenh"
                   + " WHERE (bn.HoTen LIKE '%{0}%') AND (lb.MaBenh LIKE '%{1}%') AND ( bn.DaXoaBenhNhan = 'False')", tenBenhNhan, loaiBenh);
            }

            if (tenBenhNhan != "" && ngaySinh != "" && loaiBenh == "")
            {
                strSQL = string.Format("SELECT bn.HoTen AS 'Họ Tên', bn.GioiTinh AS 'Giới Tính', bn.NgaySinh AS 'Ngày Sinh', bn.DiaChi AS 'Địa Chỉ', bn.SoDienThoai AS 'Số Điện Thoại', bn.QueQuan AS 'Quê Quán'"
                   + " FROM BenhNhan AS bn"
                   + " WHERE (bn.HoTen LIKE '%{0}%') AND (bn.NgaySinh LIKE '%{1}%') AND ( bn.DaXoaBenhNhan = 'False')", tenBenhNhan, ngaySinh);
            }

            if (tenBenhNhan == "" && ngaySinh == "" && loaiBenh != "")
            {
                strSQL = string.Format("SELECT bn.HoTen AS 'Họ Tên', bn.GioiTinh AS 'Giới Tính', bn.NgaySinh AS 'Ngày Sinh', bn.DiaChi AS 'Địa Chỉ', bn.SoDienThoai AS 'Số Điện Thoại', bn.QueQuan AS 'Quê Quán'"
                   + " FROM BenhNhan AS bn"
                   + " WHERE (lb.MaBenh LIKE '%{0}%') AND ( bn.DaXoaBenhNhan = 'False')", loaiBenh);
            }

            if (tenBenhNhan == "" && ngaySinh != "" && loaiBenh == "")
            {
                strSQL = string.Format("SELECT bn.HoTen AS 'Họ Tên', bn.GioiTinh AS 'Giới Tính', bn.NgaySinh AS 'Ngày Sinh', bn.DiaChi AS 'Địa Chỉ', bn.SoDienThoai AS 'Số Điện Thoại', bn.QueQuan AS 'Quê Quán'"
                   + " FROM BenhNhan AS bn"
                   + " WHERE (bn.NgaySinh LIKE '%{0}%') AND ( bn.DaXoaBenhNhan = 'False')", ngaySinh);
            }

            if (tenBenhNhan != "" && ngaySinh == "" && loaiBenh == "")
            {
                strSQL = string.Format("SELECT bn.HoTen AS 'Họ Tên', bn.GioiTinh AS 'Giới Tính', bn.NgaySinh AS 'Ngày Sinh', bn.DiaChi AS 'Địa Chỉ', bn.SoDienThoai AS 'Số Điện Thoại', bn.QueQuan AS 'Quê Quán'"
                   + " FROM BenhNhan AS bn"
                   + " WHERE (bn.HoTen LIKE '%{0}%') AND ( bn.DaXoaBenhNhan = 'False')", tenBenhNhan);
            }

            if (strSQL != "")
            {
                dt = dp.ExecuteQuery(strSQL);
            }
            return dt;
        }
    }
}